#define xuser mixc::powerful_cat
#include"lang/cxx/ignore_case.hpp"
#include"lang/cxx/index_of_last_miss.hpp"
#include"lang/cxx.hpp"
#include"mixc.hpp"
#include"utils/counter.hpp"

xinit(xuser::the_main){
    using namespace xuser;
    counter demo = 0;

    // 演示：寻找第一个不匹配的字符（串）的索引
    {
        xhint(demo);

        //         0123456789
        c08 str = "aaMmmmmmmm";

        // 跳过开头所有 'm'
        // index = 2
        xhint(str.index_of_last_miss('m'));
        xhint(str.index_of_last_miss("m"));

        // index = 1
        xhint(str.index_of_last_miss('m', ignore_case<char>));
        xhint(str.index_of_last_miss("m", ignore_case<char>));

        str = "Mmmmmmmm";
        // index = not_exist
        xhint(str.index_of_last_miss('m', ignore_case<char>));
        xhint(str.index_of_last_miss("m", ignore_case<char>));

        //     012345
        str = "Mememe";
        //      ^
        // 是 e 而非 M，总是最后一个匹配的前一个字符位置

        // index = 1
        xhint(str.index_of_last_miss("me"));
    }

    // 演示：寻找第一个不匹配的字符（串）列表的索引
    {
        xhint(demo);

        //         012345678
        c08 str = "DABabcbca";

        // 跳过开头出现的任意 'a', 'b', 'c' 字符
        // 所以下标指向 'B' 这个位置，index = 2
        xhint(str.index_of_last_miss({'a', 'b', 'c'}));

        // 不匹配任意字符，index = 0
        xhint(str.index_of_last_miss({'z'}));

        // 指向 'D' 这个位置 index = 0
        xhint(str.index_of_last_miss({'a', 'b', 'c'}, ignore_case<char>));

        str = "abcbcaABC";

        // 全部都匹配，所以 index = not_exist
        xhint(str.index_of_last_miss({'a', 'b', 'c'}, ignore_case<char>));

        //     0123456789
        str = "EDABabbaab";

        // 跳过开头出现的任意 "ab" 字符传
        // 所以下标指向 'B' 这个位置，index = 3
        xhint(str.index_of_last_miss({"ab", "ba"}));

        // 指向 E, index = 0
        xhint(str.index_of_last_miss({"ab", "ba", "D"}, ignore_case<char>));
    }
};
